/**
 * JSparrow - Une version numérique du jeu "Attention Pirates !" - Copyright (C) 2014 Black Pearl
 *
 * This program is free software: you can redistribute it and/or modify it under the terms of the
 * GNU General Public License as published by the Free Software Foundation, either version 3 of the
 * License, or (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without
 * even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
 * General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License along with this program. If
 * not, see <http://www.gnu.org/licenses/>.
 */
package App.Modele;

import java.util.ArrayList;
import org.junit.Before;
import org.junit.Test;
import static org.junit.Assert.*;

/**
 * Classe de test de la classe Partie.
 *
 * @author BlackPearl
 */
public class PartieTest {

    private Partie partie;
    private final static String nomPartie = "Partie de test";
    private final static int nombreJoueurs = 2;

    /**
     * Mettre en place le contexte des tests.
     */
    @Before
    public void setUp() {
        this.partie = new Partie(nomPartie, nombreJoueurs);
    }

    /**
     * Test du constructeur de la classe Partie.
     */
    @Test
    public void testPartie() {
        assertEquals(nombreJoueurs, this.partie.getNbJoueurs());
        assertEquals(nomPartie, this.partie.getNom());
        assertEquals(new ArrayList<Joueur>(), this.partie.getJoueurs());
    }

    /**
     * Test de la méthode ajouterJoueur de la classe Partie.
     */
    @Test
    public void testAjouterJoueur() {
        assertEquals(true, this.partie.ajouterJoueur("Joueur n°1"));
        assertEquals(1, this.partie.getJoueurs().size());
        assertEquals(true, this.partie.ajouterJoueur("Joueur n°2"));
        assertEquals(2, this.partie.getJoueurs().size());
    }

    /**
     * Test de la méthode initialiser de la classe Partie.
     */
    @Test
    public void testInitialiser() {
        this.partie.ajouterJoueur("Joueur n°1");
        this.partie.ajouterJoueur("Joueur n°2");
        this.partie.initialiser();
        assertEquals(this.partie.getJoueurs().get(0), this.partie.getJoueur());
        assertEquals(2, this.partie.getPlateau().getListeBateaux().size());
    }

    /**
     * Test de la méthode verificationFinPartie de la classe Partie.
     */
    @Test
    public void testVerificationFinPartiePart0() {
        this.partie.ajouterJoueur("Joueur n°1");
        this.partie.ajouterJoueur("Joueur n°2");
        this.partie.initialiser();
        assertNull(this.partie.verificationFinPartie());
        ArrayList<Repaire> listeRepaires = this.partie.getPlateau().getListeRepaires();
        for (Repaire r : listeRepaires) {
            r.setNbTresors(0);
        }
        this.partie.getPlateau().setListeRepaires(listeRepaires);
        assertNull(this.partie.verificationFinPartie());
        this.partie.getJoueur(0).setScore(100);
        assertEquals("Joueur n°1", this.partie.verificationFinPartie());
        this.partie.getJoueur(1).setScore(999);
        assertEquals("Joueur n°2", this.partie.verificationFinPartie());
        for (Repaire r : listeRepaires) {
            r.setNbTresors(1);
        }
        this.partie.getPlateau().setListeRepaires(listeRepaires);
        this.partie.getJoueur(1).setScore(15);
        this.partie.getJoueur(0).setScore(16);
        assertEquals("Joueur n°1", this.partie.verificationFinPartie());
    }

    /**
     * Test de la méthode verificationFinPartie de la classe Partie.
     */
    @Test
    public void testVerificationFinPartiePart1() {
        Partie partieTest = new Partie(nomPartie, 3);
        partieTest.ajouterJoueur("Joueur n°1");
        partieTest.ajouterJoueur("Joueur n°2");
        partieTest.ajouterJoueur("Joueur n°3");
        partieTest.initialiser();
        assertNull(partieTest.verificationFinPartie());
        ArrayList<Repaire> listeRepaires = partieTest.getPlateau().getListeRepaires();
        for (Repaire r : listeRepaires) {
            r.setNbTresors(1);
        }
        partieTest.getPlateau().setListeRepaires(listeRepaires);
        partieTest.getJoueur(0).setScore(11);
        partieTest.getJoueur(1).setScore(12);
        partieTest.getJoueur(2).setScore(13);
        assertEquals("Joueur n°3", partieTest.verificationFinPartie());
    }

    /**
     * Test de la méthode verificationFinPartie de la classe Partie.
     */
    @Test
    public void testVerificationFinPartiePart2() {
        Partie partieTest = new Partie(nomPartie, 4);
        partieTest.ajouterJoueur("Joueur n°1");
        partieTest.ajouterJoueur("Joueur n°2");
        partieTest.ajouterJoueur("Joueur n°3");
        partieTest.ajouterJoueur("Joueur n°4");
        partieTest.initialiser();
        assertNull(partieTest.verificationFinPartie());
        ArrayList<Repaire> listeRepaires = partieTest.getPlateau().getListeRepaires();
        for (Repaire r : listeRepaires) {
            r.setNbTresors(1);
        }
        partieTest.getPlateau().setListeRepaires(listeRepaires);
        partieTest.getJoueur(0).setScore(8);
        partieTest.getJoueur(1).setScore(9);
        partieTest.getJoueur(2).setScore(10);
        partieTest.getJoueur(3).setScore(11);
        assertEquals("Joueur n°4", partieTest.verificationFinPartie());
    }

    /**
     * Test de la méthode verificationFinPartie de la classe Partie.
     */
    @Test
    public void testVerificationFinPartiePart3() {
        Partie partieTest = new Partie(nomPartie, 5);
        partieTest.ajouterJoueur("Joueur n°1");
        partieTest.ajouterJoueur("Joueur n°2");
        partieTest.ajouterJoueur("Joueur n°3");
        partieTest.ajouterJoueur("Joueur n°4");
        partieTest.ajouterJoueur("Joueur n°5");
        partieTest.initialiser();
        assertNull(partieTest.verificationFinPartie());
        ArrayList<Repaire> listeRepaires = partieTest.getPlateau().getListeRepaires();
        for (Repaire r : listeRepaires) {
            r.setNbTresors(1);
        }
        partieTest.getPlateau().setListeRepaires(listeRepaires);
        partieTest.getJoueur(0).setScore(6);
        partieTest.getJoueur(1).setScore(7);
        partieTest.getJoueur(2).setScore(8);
        partieTest.getJoueur(3).setScore(9);
        partieTest.getJoueur(4).setScore(10);
        assertEquals("Joueur n°5", partieTest.verificationFinPartie());
    }

    /**
     * Test de la méthode verificationFinPartie de la classe Partie.
     */
    @Test
    public void testVerificationFinPartiePart4() {
        Partie partieTest = new Partie(nomPartie, 6);
        partieTest.ajouterJoueur("Joueur n°1");
        partieTest.ajouterJoueur("Joueur n°2");
        partieTest.ajouterJoueur("Joueur n°3");
        partieTest.ajouterJoueur("Joueur n°4");
        partieTest.ajouterJoueur("Joueur n°5");
        partieTest.ajouterJoueur("Joueur n°6");
        partieTest.initialiser();
        assertNull(partieTest.verificationFinPartie());
        ArrayList<Repaire> listeRepaires = partieTest.getPlateau().getListeRepaires();
        for (Repaire r : listeRepaires) {
            r.setNbTresors(1);
        }
        partieTest.getPlateau().setListeRepaires(listeRepaires);
        partieTest.getJoueur(0).setScore(4);
        partieTest.getJoueur(1).setScore(5);
        partieTest.getJoueur(2).setScore(6);
        partieTest.getJoueur(3).setScore(7);
        partieTest.getJoueur(4).setScore(8);
        partieTest.getJoueur(5).setScore(9);
        assertEquals("Joueur n°6", partieTest.verificationFinPartie());
    }

    /**
     * Test de la méthode configurationEnCours de la classe Partie.
     */
    @Test
    public void testConfigurationEnCours() {
        this.partie.ajouterJoueur("Joueur n°1");
        this.partie.ajouterJoueur("Joueur n°2");
        this.partie.initialiser();
        assertEquals(true, this.partie.configurationEnCours());
        this.partie.getJoueur().incNumTour();
        assertEquals(false, this.partie.configurationEnCours());
    }

    /**
     * Test de la méthode incActionEnCours de la classe Partie.
     */
    @Test
    public void testIncActionEnCours() {
        this.partie.ajouterJoueur("Joueur n°1");
        this.partie.ajouterJoueur("Joueur n°2");
        this.partie.initialiser();
        assertEquals(0, this.partie.getActionEnCours());
        this.partie.incActionEnCours();
        assertEquals(1, this.partie.getActionEnCours());
        this.partie.incActionEnCours();
        assertEquals(0, this.partie.getActionEnCours());
    }
}
